package com.wgf.config;

import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.qdrant.QdrantEmbeddingStore;
import io.qdrant.client.QdrantClient;
import io.qdrant.client.QdrantGrpcClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class LLMConfig
{
    @Bean//我们需要一个嵌入模型来将文本转换为向量，以便后续存储到向量数据库中进行相似性搜索。
    public EmbeddingModel embeddingModel(){//用于将文本转换为向量（embedding）
        return OpenAiEmbeddingModel.builder()//使用OpenAiEmbeddingModel.builder()来构建模型，设置apiKey（从环境变量中获取）、模型名称和基础URL。
                    .apiKey(System.getenv("aliQwen-api"))
                    .modelName("text-embedding-v3")
                    .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
    }

    /**
     * 创建Qdrant客户端
     * @return
     */
    @Bean//我们需要一个客户端来执行一些集合（collection）级别的操作，比如创建集合。
    public QdrantClient qdrantClient() {//用于与Qdrant向量数据库进行通信
        QdrantGrpcClient.Builder grpcClientBuilder =
                QdrantGrpcClient.newBuilder//构建一个gRPC客户端，指定主机、端口和是否使用安全连接（这里为false）
                        ("127.0.0.1", //使用 gRPC 协议连接本地 Qdrant 服务（127.0.0.1:6334）
                        6334,
                        false);//第三个参数 false 表示不使用 TLS 加密
        return new QdrantClient(grpcClientBuilder.build());// 使用构建好的gRPC客户端创建QdrantClient实例。
    }

    @Bean//我们需要一个嵌入存储来存储文本的向量表示，并能够根据查询向量进行相似性搜索
    public EmbeddingStore<TextSegment> embeddingStore() {//创建一个QdrantEmbeddingStore的Bean，用于存储和搜索向量
        return QdrantEmbeddingStore.builder()//使用建造者模式构建QdrantEmbeddingStore实例，指定Qdrant数据库的主机、端口和集合名称
                .host("127.0.0.1")//连接到本地 Qdrant 服务
                .port(6334)
                .collectionName("test-qdrant")//使用名为 "test-qdrant" 的集合存储向量
                .build();
    }
}
